/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package dao;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.List;
import javax.el.ValueExpression;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import javax.faces.event.ValueChangeEvent;
import javax.servlet.http.HttpSession;
import model.*;
import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.criterion.Restrictions;
import util.HibernateUtil;


/**
 *
 * @author crevin
 */
@ManagedBean(name="treinoImplements")
@SessionScoped
public class TreinoImplementsTreinoDAO implements ITreinoDAO{
    //<editor-fold defaultstate="collapsed" desc="Atributos">
    private Treino treino;
    private Session sessao;
    private TipoTreino tipoTreino;
    private Aluno aluno;
    
    
    private List<TipoTreino> listaTipoTreino;
    private List<Exercicio> listaExercicio;
    private List<Aluno> listaAluno;
    private List<Exercicio> exerciciosSelecionados;
    private int idExercicioTemp;
    private int idTipoTreinoTemp;
    private Date dataExpiraTemp;
    private int pesquisa;
    //</editor-fold>
    
    //<editor-fold defaultstate="collapsed" desc="Construtor">
    public TreinoImplementsTreinoDAO(){
        treino = new Treino();        
        tipoTreino = new TipoTreino();
        aluno = new Aluno();
        exerciciosSelecionados = new ArrayList<Exercicio>();
        listaTipoTreino = listarTipoTreinos();
        listaExercicio = listarExercicios();
        listaAluno = listarAlunos();
    }
    //</editor-fold>

    //<editor-fold defaultstate="collapsed" desc="Propriedades">
    public Treino getTreino() {
        return treino;
    }
    
    public void setTreino(Treino treino) {
        this.treino = treino;
    }
        
    public Collection<Exercicio> getListaExercicio() {
        return listaExercicio;
    }
    
    public Collection<Aluno> getListaAluno() {
        return listaAluno;
    }
    
    public Collection<TipoTreino> getListaTipoTreino() {
        return listaTipoTreino;
    }

    public List<Exercicio> getExerciciosSelecionados() {
        return exerciciosSelecionados;
    }

    public void setExerciciosSelecionados(List<Exercicio> exerciciosSelecionados) {
        this.exerciciosSelecionados = exerciciosSelecionados;
    }

    public int getIdExercicioTemp() {
        return idExercicioTemp;
    }

    public void setIdExercicioTemp(int idExercicioTemp) {
        this.idExercicioTemp = idExercicioTemp;
    }

    public TipoTreino getTipoTreino() {
        return tipoTreino;
    }

    public void setTipoTreino(TipoTreino tipoTreino) {
        this.tipoTreino = tipoTreino;
    }

    public Aluno getAluno() {
        return aluno;
    }

    public void setAluno(Aluno aluno) {
        this.aluno = aluno;
    }

    public int getPesquisa() {
        return pesquisa;
    }

    public void setPesquisa(int pesquisa) {
        this.pesquisa = pesquisa;
    }

    public int getIdTipoTreinoTemp() {
        return idTipoTreinoTemp;
    }

    public void setIdTipoTreinoTemp(int idTipoTreinoTemp) {
        this.idTipoTreinoTemp = idTipoTreinoTemp;
    }

    public Date getDataExpiraTemp() {
        return dataExpiraTemp;
    }

    public void setDataExpiraTemp(Date dataExpiraTemp) {
        this.dataExpiraTemp = dataExpiraTemp;
    }
    
    //</editor-fold>
    
    //<editor-fold defaultstate="collapsed" desc="Métodos">
    //<editor-fold defaultstate="collapsed" desc="Salvar">
    @Override
    public String salvar() {
        sessao = HibernateUtil.getSession();
        Transaction tr = sessao.beginTransaction();
        String msg = "";
        if(exerciciosSelecionados.size() > 0 && aluno.getId() != 0 && (tipoTreino.getId() != 0 || idTipoTreinoTemp != 0)){
            try{
                this.treino.setExercicios(exerciciosSelecionados);
                Aluno alunoTemp = (Aluno)sessao.createCriteria(Aluno.class).add(Restrictions.eq("id", aluno.getId())).uniqueResult();
                
                this.treino.setAluno(alunoTemp);
                this.treino.setDataAtualizacao(new Date());
                if(dataExpiraTemp != null)
                    this.treino.setDataExpira(dataExpiraTemp);
                
                ExternalContext externalContext = FacesContext.getCurrentInstance().getExternalContext();  
                HttpSession session = (HttpSession) externalContext.getSession(true);
                this.treino.setProfessor((Professor)session.getAttribute("Professor"));
                if(idTipoTreinoTemp != 0)
                    tipoTreino = (TipoTreino)sessao.createCriteria(TipoTreino.class).add(Restrictions.eq("id", idTipoTreinoTemp)).uniqueResult();
                    
                this.treino.setTipoTreino(tipoTreino);                
                sessao.saveOrUpdate(this.treino);
                tr.commit();
                idTipoTreinoTemp = 0;
                dataExpiraTemp = null;
                msg = "_frmCadTreino";
            }
            catch(Exception ex){
                tr.rollback();
                msg = "_frmInsucesso";
            }
            finally{
                sessao.close();
            }
        }
        else{
            msg = "_frmInsucesso";
        }    
        return msg;
    }
    //</editor-fold>
    
    //<editor-fold defaultstate="collapsed" desc="Lista Tipo de Treinos">
    @Override
    public List<TipoTreino> listarTipoTreinos() {
        sessao = HibernateUtil.getSession();
        Transaction tr = sessao.beginTransaction();
        
        try{
            Criteria listaTipoTreinosTemp = sessao.createCriteria(TipoTreino.class);
            tr.commit();
            return listaTipoTreinosTemp.list();
        }
        catch(Exception ex){
            return null;
        }
        finally{
            sessao.close();
        }
    }
    //</editor-fold>
    
    //<editor-fold defaultstate="collapsed" desc="Lista Exercícios">
    @Override
    public List<Exercicio> listarExercicios() {
        sessao = HibernateUtil.getSession();
        Transaction tr = sessao.beginTransaction();
        
        try{
            Criteria listaExerciciosTemp = sessao.createCriteria(Exercicio.class);
            tr.commit();
            return listaExerciciosTemp.list();
        }
        catch(Exception ex){
            return null;
        }
        finally{
            sessao.close();
        }
    }
    //</editor-fold>
    
    //<editor-fold defaultstate="collapsed" desc="Listar Alunos">
    @Override
    public List<Aluno> listarAlunos() {
        sessao = HibernateUtil.getSession();
        Transaction tr = sessao.beginTransaction();
        
        try{
            Criteria listaAlunosTemp = sessao.createCriteria(Aluno.class);
            tr.commit();
            return listaAlunosTemp.list();
        }
        catch(Exception ex){
            return null;
        }
        finally{
            sessao.close();
        }
    }
    //</editor-fold>
        
    //<editor-fold defaultstate="collapsed" desc="Listar Alunos por Nome">
    @Override
    public List<Aluno> listarAlunosPorNome(String nomeAluno) {
        sessao = HibernateUtil.getSession();
        Transaction tr = sessao.beginTransaction();
        
        try{
            Criteria listaAlunosPorNomeTemp = sessao.createCriteria(Aluno.class).add(Restrictions.like("Nome", nomeAluno));
            tr.commit();
            return listaAlunosPorNomeTemp.list();
        }
        catch(Exception ex){
            return null;
        }
        finally{
            sessao.close();
        }
    }
    //</editor-fold>
    
    //<editor-fold defaultstate="collapsed" desc="Adiciona Exercício">
    public void adicionaExercicio(){     
        if(idExercicioTemp != 0){
            if(!exerciciosSelecionados.contains(listaExercicio.get(idExercicioTemp - 1))){
                exerciciosSelecionados.add(listaExercicio.get(idExercicioTemp - 1));
                listaExercicio.remove(this);
                idExercicioTemp = 0;
            }
        }
    }
    //</editor-fold>
        
    //<editor-fold defaultstate="collapsed" desc="Pesquisa por aluno">
    @Override
    public String pesquisaPorAluno(ValueChangeEvent event){
        String valor = event.getNewValue().toString();
        int idAluno = Integer.parseInt(valor);
        this.treino = new Treino();
        this.tipoTreino = new TipoTreino();
        this.exerciciosSelecionados.clear();
        
        if(!valor.equals("0")){
            sessao = HibernateUtil.getSession();
            
            try{
                Treino retorno = (Treino)sessao.createCriteria(Treino.class).createAlias("aluno", "a").add(Restrictions.eq("a.id", idAluno)).uniqueResult();
                if(retorno.getId() != 0){
                    this.treino = retorno;
                    this.aluno = treino.getAluno();
                    this.tipoTreino = treino.getTipoTreino();
                    this.exerciciosSelecionados = (List)treino.getExercicios();
                    idTipoTreinoTemp = 0;
                    dataExpiraTemp = null;
                }                
            }
            catch(Exception ex){
                return "_frmCadTreino";
            }
            finally{
                sessao.close();
            }
        }
        return "_frmCadTreino";
    }
    //</editor-fold>
    //</editor-fold>
    
}
